import axios from 'axios'

// import qs from 'qs'
import { ElMessage } from 'element-plus'
import { encrypt } from '../utils/rsa'
import useUserStore from '@/store/modules/user'

const api = axios.create({
  baseURL: (import.meta.env.DEV && import.meta.env.VITE_OPEN_PROXY === 'true') ? '/proxy/' : import.meta.env.VITE_APP_API_BASEURL,
  timeout: 1000 * 60,
  responseType: 'json',
})

api.interceptors.request.use(
  (request) => {
    const userStore = useUserStore()
    /**
     * 全局拦截请求发送前提交的参数
     * 以下代码为示例，在请求头里带上 token 信息
     */
    // if (userStore.isLogin && request.headers) {
    //   request.headers.Token = userStore.token
    // }
    // console.log(JSON.stringify(request.data))
    // console.log(decrypt(encrypt(JSON.stringify(request.data))))
    if (userStore.token && request.headers) {
      request.url === 'login/refresh' ? request.headers.Authorization = `Bearer ${userStore.refresh_token}` : request.headers.Authorization = `Bearer ${userStore.token}`
    }
    console.log(request.data)
    if (request.data) {
      request.data = { data: encrypt(JSON.stringify(request.data)) }
    }
    else {
      request.data = { data: encrypt(JSON.stringify({ t: new Date().getTime() })) }
    }
    // 是否将 POST 请求参数进行字符串化处理
    if (request.method === 'post') {
      // request.data = qs.stringify(request.data, {
      //   arrayFormat: 'brackets',
      // })
    }
    return request
  },
)

api.interceptors.response.use(
  (response) => {
    /**
     * 全局拦截请求发送后返回的数据，如果数据有报错则在这做全局的错误提示
     * 假设返回数据格式为：{ status: 1, error: '', data: '' }
     * 规则是当 status 为 1 时表示请求成功，为 0 时表示接口需要登录或者登录状态失效，需要重新登录
     * 请求出错时 error 会返回错误信息
     */
    // if (response.data.status === 1) {
    //   if (response.data.error !== '') {
    //     // 这里做错误提示，如果使用了 element plus 则可以使用 Message 进行提示
    //     // ElMessage.error(options)
    //     return Promise.reject(response.data)
    //   }
    // }
    // else {
    //   toLogin()
    // }
    // return Promise.resolve(response.data)
    if (response.data.code === 200) {
      // 正确返回
      return Promise.resolve(response.data)
    }
    else if (response.data.code === 400) {
      // 400表示请求内容出现错误
      ElMessage({
        message: response.data.msg,
        type: 'warning',
      })
      // 正确返回
      return Promise.resolve(response.data)
    }
    else if (response.data.code === 407) {
      // 407表示需要重新登录
      ElMessage({
        message: response.data.msg,
        type: 'error',
      })
      useUserStore().logout()
      return Promise.reject(response.data)
    }
    else {
      return Promise.reject(response)
    }
  },
  async (error) => {
    const message = error.message
    if (error.response.status === 401 && !error.config._retry) {
      error.config._retry = true
      // 401需要刷新token
      await useUserStore().refresh().catch(() => {
        return Promise.reject(error)
      })

      return api.request(error.config)
    }
    else if (message === 'Network Error') {
      ElMessage({
        message: '网络故障',
        type: 'error',
      })
    }
    else if (message.includes('timeout')) {
      ElMessage({
        message: '接口请求超时',
        type: 'error',
      })
    }
    // else if (message.includes('Request failed with status code')) {
    //   message = `接口${message.substr(message.length - 3)}异常`
    // }
    // ElMessage({
    //   message,
    //   type: 'error',
    // })
    return Promise.reject(error)
  },
)

export default api
